home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dviapollo / suninteract.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  6KB  |  249 lines

  1. /* @(#)suninteract.c    1.11 2/18/87 */
  2. #include "header.h"
  3. #include <suntool/sunview.h>
  4. #include <suntool/icon.h>
  5. #include <suntool/panel.h>
  6. #include <suntool/canvas.h>
  7. static short icon_data []={
  8. #include "dvisuntool.icon"
  9. };
  10. mpr_static (icon_pixrect, 64, 64, 1, icon_data);
  11. struct pixrect *panel_button_image ();
  12. int set_mode;    /* default modes */
  13. int clr_mode;
  14. int draw_mode; 
  15. struct pixwin *screen; /* Object to display graphics on. */
  16. Canvas canvas; /* Canvas we are displaying graphics on. */
  17.  
  18. Panel_item warning_message_item; /* Place to put warning messages. */
  19. Panel_item filename_item; /* Thing to read file names with. */
  20. Panel_item page_slider; /* Slider on the display for paging the */
  21.             /* document.*/ 
  22. void refresh_proc ();
  23.  
  24. /* Draw a black box on the screen. */
  25. void black_box (x, y, width, height)
  26.      int x,y,width,height;
  27. {
  28.   pw_rop (screen, x, y, width, height,
  29.       set_mode, NULL, 0, 0);
  30. }  
  31.  
  32. int screen_height ()
  33. {
  34.   return ((int) window_get (canvas, CANVAS_HEIGHT));
  35. }
  36.  
  37. /* Read a character image starting at the current pointer of the given */
  38.  /* file.  Width is the width in pixels of the object, height is the */
  39. /* height in pixels of the object. */
  40. /* For Suntools, a CharImage is really a pixrect pointer. */
  41. CharImage read_char (pxlfp, width, height)
  42.      FILE *pxlfp;
  43.      int width, height;
  44. {
  45.   register int nshorts, i, col, nints;
  46.   register short *dp, *sp;
  47.   static int buffer[8];
  48.   register struct pixrect *pr;
  49.  
  50.   nshorts = (width + 15) >> 4;
  51.   pr = mem_create(width, height, 1);
  52.   nints = (nshorts + 1) >> 1;
  53.   dp = ((struct mpr_data *)pr->pr_data)->md_image;
  54.   for (col = 0; col < height; col++) {
  55.     fread(buffer, 4, nints, pxlfp);
  56.     sp = (short *) &buffer[0];
  57.     for (i = nshorts; i > 0; i--) *dp++ = *sp++;
  58.   }
  59.   return ((CharImage) pr);
  60. }
  61.  
  62. void show_char (x, y, width, height, image)
  63.      int x, y, width, height;
  64.      CharImage image;
  65. {
  66.   pw_rop(screen, x, y, width, height, draw_mode,
  67.      (struct pixrect *)image, 0, 0);
  68. }
  69.  
  70. void clearscreen ()
  71. {
  72.   pw_rop(screen, 0, 0,
  73.      (int) window_get (canvas, CANVAS_WIDTH),
  74.      (int) window_get (canvas, CANVAS_HEIGHT),
  75.      clr_mode, NULL, 0, 0);
  76. }
  77.  
  78. /* Update the number on the page number slider to n. */
  79. void update_slider (n)
  80.      int n;
  81. {
  82.   panel_set_value (page_slider, n);
  83. }
  84.  
  85. /* Update the number of pages on the slider, and don't display it at */
  86.  /* all in trivial cases. */ 
  87. void show_slider (pages)
  88.      int pages;
  89. {
  90.   if (pages > 1) {
  91.     panel_set (page_slider,
  92.            PANEL_MAX_VALUE, pages,
  93.            PANEL_SHOW_ITEM, TRUE,
  94.            0);
  95.   } else {
  96.     panel_set (page_slider, PANEL_SHOW_ITEM, FALSE, 0);
  97.   };
  98. }
  99.  
  100. void lock_canvas ()
  101. {
  102.   struct rect r;
  103.  
  104.   pw_get_region_rect (screen, &r);
  105.   pw_lock (screen, &r);
  106. }
  107.  
  108. void unlock_canvas ()
  109. {
  110.   pw_unlock (screen);
  111. }
  112.  
  113. void showerror (string)
  114.      char *string;
  115. {
  116.   panel_set (warning_message_item, PANEL_LABEL_STRING, string, 0);
  117. }
  118.  
  119. void clearerror ()
  120. {
  121.   panel_set (warning_message_item, PANEL_LABEL_STRING, "", 0);
  122. }
  123.  
  124. void page_proc (item, value, event)
  125.      Panel_item item;
  126.      int value;
  127.      Event *event;
  128. {
  129.   goto_page (value);
  130. };
  131.  
  132. static Panel panel;
  133.  
  134. void create_a_button (name, width, x, y, callout)
  135.      char *name;
  136.      int width, x, y;
  137.      void (*callout) ();
  138. {
  139.   panel_create_item (panel, PANEL_BUTTON,
  140.              PANEL_LABEL_IMAGE,
  141.              panel_button_image (panel, name, width,
  142.                      NULL),
  143.              PANEL_NOTIFY_PROC, callout,
  144.              PANEL_ITEM_X, ATTR_COL (x),
  145.              PANEL_ITEM_Y, ATTR_ROW (y),
  146.              0);
  147. }
  148.  
  149. char *curfilename ()
  150. {
  151.   panel_get_value (filename_item);
  152. }
  153.  
  154. void my_mouse_proc (window, event)
  155.      Window window;
  156.      Event *event;
  157. {
  158.   if (event_is_button (event)) {
  159.     if (event_is_down (event)) {
  160.       buttondown (event_x (event), event_y (event));
  161.     } else {
  162.       buttonup (event_x (event), event_y (event));
  163.     };
  164.   };
  165. };
  166.      
  167.  
  168. void main(argc, argv)
  169.      int argc;
  170.      char *argv[];
  171. {
  172.   Frame frame;
  173.  
  174.   frame = window_create (NULL, FRAME,
  175.              FRAME_LABEL, argv[0],
  176.              FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
  177.              FRAME_NO_CONFIRM, TRUE,
  178.              FRAME_ARGC_PTR_ARGV, &argc, argv,
  179.              FRAME_ICON,
  180.              icon_create (ICON_IMAGE, &icon_pixrect, 0),
  181.              0);
  182.   /* get enviroment variables that allows for a path name in unix */
  183.   if ((PXLpath=getenv("BGPXLPATH")) == NULL)
  184.     PXLpath = FONTAREA;
  185.   panel = window_create (frame, PANEL,
  186.              WIN_HEIGHT, ATTR_ROW (2), 0);
  187.   filename_item = panel_create_item (panel, PANEL_TEXT,
  188.                      PANEL_LABEL_STRING, "Filename:",
  189.                      PANEL_VALUE_DISPLAY_LENGTH, 20,
  190.                      0);
  191.   warning_message_item =
  192.     panel_create_item (panel, PANEL_MESSAGE,
  193.                PANEL_LABEL_STRING,
  194.                "                      ",
  195.                PANEL_ITEM_Y, ATTR_ROW (1),
  196.                PANEL_ITEM_X, ATTR_COL (0),
  197.                0);
  198.   create_buttons ();
  199.   page_slider = panel_create_item  (panel, PANEL_SLIDER,
  200.                     PANEL_SHOW_VALUE, TRUE,
  201.                     PANEL_LABEL_STRING, "Page:",
  202.                     PANEL_NOTIFY_PROC, page_proc,
  203.                     PANEL_NOTIFY_LEVEL, PANEL_DONE,
  204.                     PANEL_MIN_VALUE, 1,
  205.                     PANEL_SHOW_ITEM, FALSE,
  206.                     PANEL_MAX_VALUE, 1, 
  207.                     PANEL_ITEM_X, ATTR_COL (57),
  208.                     PANEL_ITEM_Y, ATTR_ROW (0),
  209.                     0);
  210.   canvas = window_create (frame, CANVAS,
  211.               CANVAS_REPAINT_PROC, refresh_proc,
  212.               CANVAS_RETAINED, FALSE,
  213.               WIN_CONSUME_PICK_EVENT,
  214.               WIN_MOUSE_BUTTONS,
  215.               WIN_EVENT_PROC, my_mouse_proc,
  216.               0);
  217.   screen = canvas_pixwin (canvas);
  218.   set_mode = PIX_COLOR(1) | PIX_SRC; 
  219.   clr_mode = PIX_COLOR(0) | PIX_SRC;
  220.   draw_mode = PIX_SRC | PIX_DST;
  221.   reset_scroll ();
  222.   if (argv [1] != NULL) {
  223.     panel_set_value (filename_item, argv [1]);
  224.     load_proc ();
  225.   }
  226.   window_main_loop (frame);
  227. }
  228.  
  229. #ifdef thisisametacomment
  230.  This code used to be in here before we made this interact 
  231.   with suntools properly.  It may be useful again someday.
  232. #ifdef DEBUG
  233.     case 'f':            /* fine tune y */
  234.       ydefault = ReadInt();
  235.       yscreen = ydefault;
  236.       redisplay (&cpagep, &ppagep);
  237.       break;
  238.     case 'h':            /* fine tune hconv */
  239.       hconv = DoConv(num, den, ReadInt());
  240.       redisplay (&cpagep, &ppagep);
  241.       break;
  242.     case 'v':            /* fine tune hconv */
  243.       vconv = DoConv(num, den, ReadInt());
  244.       redisplay (&cpagep, &ppagep);
  245.       break;
  246. #endif
  247. /* End metacomment */
  248. #endif
  249.